<?php
define('DEBUG', 'on');
define("WEBPATH", str_replace("\\","/", __DIR__));
require __DIR__ . '/../libs/lib_config.php';

class WebSocket extends Swoole\Protocol\WebSocket
{
    protected $message;
    static public $table;

    public function __construct()
    {
        parent::__construct();
        $table = new swoole_table(1024);
        $table->column('client_id', swoole_table::TYPE_INT);
        $table->column('userid', swoole_table::TYPE_INT);
        $table->column('client_name', swoole_table::TYPE_STRING, 20);
        $table->create();
        self::$table = $table;

    }

    /**
     * @param     $serv swoole_server
     * @param int $worker_id
     */
    function onStart($serv, $worker_id = 0)
    {
        Swoole::$php->router(array($this, 'router'));
        parent::onStart($serv, $worker_id);
    }

    function router()
    {
        var_dump($this->message);
    }

    /**
     * 进入
     * @param $client_id
     */
    function onEnter($client_id)
    {

    }

    /**
     * 下线时，通知所有人
     */
    function onExit($client_id)
    {
        $close_info = self::$table->get($client_id);
        var_dump($close_info);
        $message_close = array('type'=>'logout', 'from_client_id'=>$client_id, 'from_client_name'=>$close_info['client_name'], 'time'=>date('Y-m-d H:i:s'));
        self::$table->del($client_id);
        echo "client {$client_id} closed\n";
        $this->broadcast($client_id, json_encode($message_close));
        //将下线消息发送给所有人
        //$this->log("onOffline: " . $client_id);
        //$this->broadcast($client_id, "onOffline: " . $client_id);
    }

    function onMessage_mvc($client_id, $ws)
    {
        $this->log("onMessage: ".$client_id.' = '.$ws['message']);

        $this->message = $ws['message'];
        $response = Swoole::$php->runMVC();

        $this->send($client_id, $response);
        //$this->broadcast($client_id, $ws['message']);
    }

    /**
     * 接收到消息时
     */
    function onMessage($client_id, $ws)
    {
        // 客户端传递的是json数据
        $message_data = json_decode(($ws['message']), true);
        if(!$message_data)
        {
            return ;
        }
        switch($message_data['type'])
        {
            case 'login':
                $client_name = htmlspecialchars($message_data['client_name']);
                $userid = htmlspecialchars($message_data['userid']);
                /*$model_user = model('User');
                $user_info = $model_user->get($userid);
                var_dump($user_info);*/
                //记录客户端号
                self::$table->set($client_id, array('client_id' => $client_id, 'client_name' => $client_name, 'userid' => $userid));
                echo "client {$client_id} open\n";

                // 获取所有用户列表 , 除了自己
                $clients_list = array();
                foreach(self::$table as $key => $row){
                    //var_dump($row);
                    if($key != $client_id)
                        $clients_list[$key] = $row;
                }

                // 转播给当前房间的所有客户端，xx进入聊天室 message {type:login, client_id:xx, name:xx}
                $new_message = array('type'=>$message_data['type'], 'client_id' => $client_id, 'client_name'=>htmlspecialchars($client_name), 'time'=>date('Y-m-d H:i:s'), 'userid' => $userid);
                $message = json_encode($new_message);
                $this->broadcast($client_id, $message);

                // 给当前用户发送用户列表
                //sendToGroup($_server, json_encode($new_message));
                $new_message['client_list'] = $clients_list;
                $this->send($client_id, json_encode($new_message));

                break;
            case 'chatMessage':
                if(!$message_data['content']){
                    return;
                }

                // 非法请求
                $client_info = self::$table->get($client_id);
                $client_name = $client_info['client_name'];

                // 私聊
                $new_message = array(
                    'type'=>'chatMessage',
                    'from_client_id'=>$client_id,
                    'from_client_name' =>$client_name,
                    'to_client_id'=>$message_data['to_client_id'],
                    'avatar' => $message_data['avatar'],
                    'content'=> nl2br(htmlspecialchars($message_data['content'])),
                    'time'=>date('Y-m-d H:i:s'),
                );

                $this->send($message_data['to_client_id'], json_encode($new_message));
                break;
        }
        $this->log("onMessage: ".$client_id.' = '.$ws['message']);
        $this->send($client_id, 'Server: '.$ws['message']);
		//$this->broadcast($client_id, $ws['message']);
    }

    function broadcast($client_id, $msg)
    {
        foreach ($this->connections as $clid => $info)
        {
            if ($client_id != $clid)
            {
                $this->send($clid, $msg);
            }
        }
    }

    function saveMessage(){

    }
}

//require __DIR__'/phar://swoole.phar';
Swoole\Config::$debug = true;
Swoole\Error::$echo_html = false;

$AppSvr = new WebSocket();
$AppSvr->loadSetting(__DIR__."/swoole.ini"); //加载配置文件
$AppSvr->setLogger(new \Swoole\Log\EchoLog(true)); //Logger

/**
 * 如果你没有安装swoole扩展，这里还可选择
 * BlockTCP 阻塞的TCP，支持windows平台
 * SelectTCP 使用select做事件循环，支持windows平台
 * EventTCP 使用libevent，需要安装libevent扩展
 */
$enable_ssl = false;
$server = Swoole\Network\Server::autoCreate('0.0.0.0', 9505, $enable_ssl);
$server->setProtocol($AppSvr);
//$server->daemonize(); //作为守护进程
$server->run(array(
    'worker_num' => 1,
    //'ssl_key_file' => __DIR__.'/ssl/ssl.key',
    //'ssl_cert_file' => __DIR__.'/ssl/ssl.crt',
    //'max_request' => 1000,
    //'ipc_mode' => 2,
    //'heartbeat_check_interval' => 40,
    //'heartbeat_idle_time' => 60,
));
